//实现一些相关contact功能的文件
#include "contact.h"
//
//初始化通讯录;
void SETcontact(contact *p,int sz)
{
    memset(p,'0',sz);
}
//
//添加联系人
void Add(contact *p,int* count)
{
    //考虑到可能会增加好几个联系人
    int num=0;
    
    printf("要添加几个联系人呢？");
    scanf("%d",&num);
    
    if(num<=DATA && *count<DATA)
    {
        while(num--)
        {
            //添加联系人
            printf("请输入要添加联系人的信息:\n");
            printf("请输入姓名:");
            scanf("%s",p->name);
            
            printf("请输入性别:");
            scanf("%s",p->sex);
            
            printf("请输入联系人地址:");
            scanf("%s",p->address);
            
            printf("请输入联系人电话:");
            scanf("%s",p->tele);
            printf("已添加姓名：%s 为联系人\n",p->name);
            p++;
            (*count)++;
        }
        return;
    }
    else
    {
        if(*count>=DATA)
        printf("你的通讯录已存满\n");
        else
        printf("你要存储的联系人数量超过通讯录能存储的最大数量\n");
    }
   
}
//
contact *search(int x,contact *p,const char *str,int count)
{
    
    if(x>4 || x<0)
    {
        printf("输入有误\n");
        return NULL;
    }
    else
    {
        contact* (*searchfun[5])(contact*,const char*)={0,&Search_name,&Search_tele,&Search_address,&Search_sex};
        contact *ret=searchfun[x](p,str);
        //返回值应该给我们返回
        return ret;
    }
  
}
void Del(contact *p,int* count,int sz)
{
    //删除联系人 
    if(*count==0)
    {
        printf("通讯录内容为空，请试着添加一位联系人吧\n");
        return;
    }
    //1.找到要删除的对象-->查找联系人search()
    char str[30];
    int s1=0;
    enum choice
    {
        姓名=1,
        电话,
        地址,
        性别
    };
    printf("即将为您查找要删除的对象,请选择索引途径(1->姓名,2->电话,3->地址,4->性别)\n");
    scanf("%d",&s1);
    printf("请输入内容:\n");
    scanf("%s",str);
    contact *ret=search(s1,p,str,*count);
    printf("为您找到以下信息：姓名:%s 性别:%s 地址:%s 电话:%s\n",ret->name,ret->sex,ret->address,ret->tele);
    printf("确认删除吗？确认请按下回车，那么这个联系人将永远不会出现在你的通讯录了\n");
    getchar();
    char input = getchar();

    //2.重置为0
    int i=0;
    if(input=='\n')
    {
            while(ret<p+(*count+1))
            {
                *ret=*(ret+1);
                ret++;
            }
            (*count)--;
            printf("已删除\n");
    }
    else
    printf("删除失败\n");
}
//
//
//修改联系人信息
contact *modify_name(contact** ptr)
{
    //这里二级指针*ptr 就是 p
    char str[20];
    printf("请输入新的昵称或者备注\n");
    scanf("%s",str);
    strcpy((*ptr)->name,str);
    return *ptr;
}

contact *modify_sex(contact** ptr)
{
    //这里二级指针*ptr 就是 p
    char str[5];
    printf("请输入性别\n");
    scanf("%s",str);
    strcpy((*ptr)->sex,str);
    return *ptr;
}
contact *modify_address(contact** ptr)
{
    //这里二级指针*ptr 就是 p
    char str[30];
    printf("请输入新的地址\n");
    scanf("%s",str);
    strcpy((*ptr)->address,str);
    return *ptr;
}

contact * modify_tele(contact** ptr)
{
    //这里二级指针*ptr 就是 p
    char str[15];
    printf("请输入新的电话号码\n");
    scanf("%s",str);
    strcpy((*ptr)->tele,str);
    return *ptr;
}

//修改
 void Modify(contact *p,const int count)
 {
    //1.先找到目标
        if(count==0)
    {
        printf("通讯录内容为空，请试着添加一位联系人吧\n");
        return;
    }

    char str[30];
    int s1=0;
    enum choice
    {
        姓名=1,
        电话,
        地址,
        性别
    };
    printf("即将为您查找要修改的对象,请选择索引途径(1->姓名,2->电话,3->地址,4->性别)\n");
    scanf("%d",&s1);
    printf("请输入内容:\n");
    scanf("%s",str);
    contact *ret=search(s1,p,str,count);
    if(ret==NULL)
    {
        printf("未找到有关%s的信\n",str);
    }
    else
    printf("为你找到以下内容--姓名:%s,性别:%s,地址：%s,电话:%s\n",ret->name,ret->sex,ret->address,ret->tele);

    //2.修改要改的选项
    int input=0;//位用户提供选择修改项
    printf("请选择您要修改的内容 1.姓名2.性别 3.地址 4.电话(您也可与选择输入'0'退出当前操作)\n");
    //1姓名 2。性别 3.地址 4.电话 0.退出
    //这里可能多次修改 那就写成循环
    printf("请选择->\n");
    scanf("%d",&input);
    while(input)
    {
        contact *r=NULL;
          switch(input)
        {   
            case 1:
            //姓名
                r=modify_name(&p);
                printf("已修改--新的备注是:%s,性别:%s,地址：%s,电话:%s\n",r->name,r->sex,r->address,r->tele);
                break;
            case 2:
            //性别
                r=modify_sex(&p);
                printf("已修改--备注是:%s,修改后性别:%s,地址：%s,电话:%s\n",r->name,r->sex,r->address,r->tele);
                break;
            case 3:
            //地址
                r=modify_address(&p);
                printf("已修改--备注是:%s,性别:%s,新的地址：%s,电话:%s\n",r->name,r->sex,r->address,r->tele);
                break;
            case 4:
            //电话
                r=modify_tele(&p);
                printf("已修改--备注是:%s,性别:%s,地址：%s,新的电话:%s\n",r->name,r->sex,r->address,r->tele);
                break;
            case 0:
                printf("退出修改操作\n");
                return;
            default:
                printf("输入错误，请重新选择\n");
                break;
        }
        printf("请选择您要修改的内容 1.姓名2.性别 3.地址 4.电话(您也可与选择输入'0'退出当前操作)\n");
        //1姓名 2。性别 3.地址 4.电话 0.退出
        //这里可能多次修改 那就写成循环
        printf("请选择->\n");
        scanf("%d",&input);   
    }
    return;
 }

void ShowPeo(const contact *p,int count)
{
    //1.打印每一个内容-->循环
    if(count==0)
    {
        printf("您当前通讯录为空,请试着添加一位联系人吧\n");
        return;
    }

    printf("通讯录一共有 %d 位联系人信息\n",count);
    int i=0;
    for(i=0;i<count;i++)
    {
        printf("%d. 姓名:%s 性别:%s 地址:%s 电话:%s \n",i+1,(p+i)->name,(p+i)->sex,(p+i)->address,(p+i)->tele);
    }
}
//姓名索引
contact *Search_name(contact *dest,const char* str)
{
    contact* bagin=dest;
    if(strncmp(dest->name,"0",1)==0)
    return NULL;

    char*ret=strstr((bagin->name),str);

    while(ret==NULL)
    {
        bagin++;
        ret=strstr((bagin->name),str);
        if(strncmp(bagin->name,"0",1)==0)
        return NULL;
    }
    return bagin;
}
//电话索引
contact *Search_tele(contact *dest,const char* str)
{
    contact* bagin=dest;
    if(strncmp(dest->tele,"0",1)==0)
    return NULL;

    char*ret=strstr((bagin->tele),str);

    while(ret==NULL)
    {
        bagin++;
        ret=strstr((bagin->tele),str);
        if(strncmp(bagin->tele,"0",1)==0)
        return NULL;
    }
    return bagin;
}

//地址索引
contact *Search_address(contact *dest,const char* str)
{
    contact* bagin=dest;

    if(strncmp(dest->address,"0",1)==0)
    return NULL;

    char*ret=strstr((bagin->address),str);

    while(ret==NULL)
    {
        bagin++;
        ret=strstr((bagin->address),str);
        if(strncmp(bagin->address,"0",1)==0)
        return NULL;
    }
    return bagin;
}
//性别索引
contact *Search_sex(contact *dest,const char* str)
{
    contact* bagin=dest;
    if(strncmp(dest->sex,"0",1)==0)
    return NULL;

    char*ret=strstr((bagin->sex),str);

    while(ret==NULL)
    {
        bagin++;
        ret=strstr((bagin->sex),str);
        if(strncmp(bagin->sex,"0",1)==0)
        return NULL;
    }
    return bagin;
}

contact* (*searchfun[5])(contact*,const char*)={0,&Search_name,&Search_tele,&Search_address,&Search_sex};
  
//查询联系人
void SearchPeo(contact *p,int *count)
{
    if(*count==0)
    {
        printf("通讯录里内容为空,请试着添加一位联系人吧\n");
        return;
    }
    char str[30];
    int s1=0;
    enum choice
    {
        姓名=1,
        电话,
        地址,
        性别
    };
    
    //查找联系人 
    //1.用户输入查找人的相关信息 
    printf("请选择索引途径(1->姓名,2->电话,3->地址,4->性别):\n");
    //
    //Bug#####################
    //这里要防止用户输入错误
    //Bug#####################
    
    scanf("%d",&s1);
    printf("请输入内容:\n");
    scanf("%s",str);

    //因为要满足多个地方的函数实现索引查询功能，这里不可以写死在一个函数里
    //独立出来 封装成search函数

    contact*r=search(s1,p,str,*count);
    printf("正在为您查找，清稍等\n");
    sleep(2);
    if(r==NULL)
    {
        printf("未找到有关与%s的信息\n",str);
    }
    else
    printf("为您找到下列信息[姓名为：%s 地址为：%s 性别为：%s 电话为：%s]\n",r->name,r->address,r->sex,r->tele);

}
//
//查询内存
void SearchMem()
{
    printf("您最大能存储 %d 个联系人\n",DATA);
}
//
//


